package funcionario;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.LinkedList;

import menu.ConexaoBD;

import endereco.Endereco;
import funcionario.exceptions.ExceptionNuloOuVazio;

public class RepositorioBDFuncionario implements IRepositorioFuncionario {
	
	public Collection<Funcionario> pesqListaFuncionario(String vNome) throws ClassNotFoundException, SQLException{
		Collection<Funcionario> PesqLista = new LinkedList<Funcionario>();
		Connection conect = ConexaoBD.pegarConexao();
		PreparedStatement stmt = null;
		stmt = conect.prepareStatement("Select codigofuncionario, nomefuncionario, email, cpf, identidade, salario, comissao, reajuste, codigoendereco from funcionario where upper(nomefuncionario) like upper(?) ");
		stmt.setString(1, vNome.trim() + "%");
		ResultSet rs =  stmt.executeQuery();		
		
		while(rs.next()){
			Funcionario empregado = new Funcionario();
			
			empregado.setCodigoFuncionario(rs.getInt(1));
			empregado.setNomeFuncionario(rs.getString(2).toUpperCase());
			empregado.setEmail(rs.getString(3));
			empregado.setCpf(rs.getString(4).toUpperCase());
			empregado.setIdentidade(rs.getString(5).toUpperCase());
			empregado.setSalario(rs.getDouble(6));
			empregado.setComissao(rs.getDouble(7));
			empregado.setReajuste(rs.getDouble(8));
			

			empregado.setEndereco(new Endereco(rs.getInt("codigoendereco")));

			PreparedStatement pstmt = conect.prepareStatement("select * from endereco where codigoendereco = ?");
			pstmt.setInt(1, empregado.getEndereco().getCodigoEndereco());

			ResultSet resultado2 = pstmt.executeQuery();

			while(resultado2.next()){
				Endereco end = new Endereco();
				end.setCodigoEndereco(resultado2.getInt(1));
				end.setLogradouro(resultado2.getString(2).toUpperCase());
				end.setNumero(resultado2.getString(3).toUpperCase());
				end.setBairro(resultado2.getString(4).toUpperCase());
				end.setEstado(resultado2.getString(6).toUpperCase());
				end.setCidade(resultado2.getString(5).toUpperCase());
				end.setCep(resultado2.getString(7).toUpperCase());
				empregado.setEndereco(end);
			}
		   
			PesqLista.add(empregado);
		}
		
		return PesqLista;
		
	}
	
	public Collection<Funcionario> getListaFuncionario() throws SQLException, ClassNotFoundException {
		Collection<Funcionario> ListaFuncionario = new LinkedList<Funcionario>();
		Connection conect = ConexaoBD.pegarConexao();
		Statement stmt = null;
		stmt = conect.createStatement();
		
		ResultSet rs =  stmt.executeQuery("Select codigofuncionario, nomefuncionario, email, cpf, identidade, salario, comissao, reajuste, codigoendereco from funcionario order by nomefuncionario");
		while(rs.next()){
			Funcionario empregado = new Funcionario();
			
			empregado.setCodigoFuncionario(rs.getInt(1));
			empregado.setNomeFuncionario(rs.getString(2).toUpperCase());
			empregado.setEmail(rs.getString(3));
			empregado.setCpf(rs.getString(4).toUpperCase());
			empregado.setIdentidade(rs.getString(5).toUpperCase());
			empregado.setSalario(rs.getDouble(6));
			empregado.setComissao(rs.getDouble(7));
			empregado.setReajuste(rs.getDouble(8));
			

			empregado.setEndereco(new Endereco(rs.getInt("codigoendereco")));

			PreparedStatement pstmt = conect.prepareStatement("select * from endereco where codigoendereco = ?");
			pstmt.setInt(1, empregado.getEndereco().getCodigoEndereco());

			ResultSet resultado2 = pstmt.executeQuery();

			while(resultado2.next()){
				Endereco end = new Endereco();
				end.setCodigoEndereco(resultado2.getInt(1));
				end.setLogradouro(resultado2.getString(2).toUpperCase());
				end.setNumero(resultado2.getString(3).toUpperCase());
				end.setBairro(resultado2.getString(4).toUpperCase());
				end.setEstado(resultado2.getString(6).toUpperCase());
				end.setCidade(resultado2.getString(5).toUpperCase());
				end.setCep(resultado2.getString(7).toUpperCase());
				empregado.setEndereco(end);
			}

			ListaFuncionario.add(empregado);
		}
		return ListaFuncionario;
	}
	public void CadastrarFuncionario(Funcionario empregado) throws ClassNotFoundException, SQLException{
		Connection con = ConexaoBD.pegarConexao();
		
		PreparedStatement smtd = con.prepareStatement("insert into endereco (logradouro, numero, bairro, cidade, estado, cep) values (?, ?, ?, ?, ?, ?)");
		smtd.setString(1, empregado.getEndereco().getLogradouro().toUpperCase());
		smtd.setString(2, empregado.getEndereco().getNumero().toUpperCase());    
		smtd.setString(3, empregado.getEndereco().getBairro().toUpperCase());    
		smtd.setString(4, empregado.getEndereco().getCidade().toUpperCase());        
		smtd.setString(5, empregado.getEndereco().getEstado().toUpperCase());        
		smtd.setString(6, empregado.getEndereco().getCep().toUpperCase());       
		smtd.executeUpdate(); 		
		
		smtd = con.prepareStatement("select codigoendereco from endereco where logradouro = ? and numero = ? and bairro = ? and cidade = ? and estado = ? and cep = ?");
		smtd.setString(1, empregado.getEndereco().getLogradouro().toUpperCase());                  
		smtd.setString(2, empregado.getEndereco().getNumero().toUpperCase());    
		smtd.setString(3, empregado.getEndereco().getBairro().toUpperCase());    
		smtd.setString(4, empregado.getEndereco().getCidade().toUpperCase());        
		smtd.setString(5, empregado.getEndereco().getEstado().toUpperCase());        
		smtd.setString(6, empregado.getEndereco().getCep().toUpperCase()); 
		
		
		Endereco end = new Endereco();                    
        ResultSet resultado = smtd.executeQuery();           
        resultado.next();
        end.setCodigoEndereco(resultado.getInt(1));
        empregado.getEndereco().setCodigoEndereco(end.getCodigoEndereco());
				
		PreparedStatement smt = con.prepareStatement("insert into funcionario (nomefuncionario,email,cpf,identidade,salario,comissao,reajuste, codigoendereco) values (?,?,?,?,?,?,?,?)");
		smt.setString(1, empregado.getNomeFuncionario().toUpperCase());
		smt.setString(2, empregado.getEmail());
		smt.setString(3, empregado.getCpf().toUpperCase());
		smt.setString(4, empregado.getIdentidade().toUpperCase());
		smt.setDouble(5, empregado.getSalario());
		smt.setDouble(6, empregado.getComissao());
		smt.setDouble(7, empregado.getReajuste());
		smt.setInt(8, end.getCodigoEndereco());
		
		smt.executeUpdate();
	}
	public void ExcluirFuncionario(Funcionario empregado) throws SQLException, ExceptionNuloOuVazio, ClassNotFoundException{
		Connection conect = ConexaoBD.pegarConexao();
		
		PreparedStatement pstmt = conect.prepareStatement("delete from funcionario where codigofuncionario = ?");
		pstmt.setInt(1, empregado.getCodigoFuncionario());
		
		pstmt.executeUpdate();	
	}
	public Funcionario PesquisarFunicionario(String vCodigo) throws ExceptionNuloOuVazio, ClassNotFoundException, SQLException{
		Connection conect = ConexaoBD.pegarConexao();
		
		PreparedStatement pstmt = conect.prepareStatement("Select codigofuncionario, nomefuncionario, email, cpf, identidade, salario, comissao, reajuste, codigoendereco from funcionario where codigofuncionario = ? ");
		pstmt.setInt(1, Integer.parseInt(vCodigo.trim()));
		
		ResultSet rs = pstmt.executeQuery();
		
		rs.next();
		Funcionario empregado = new Funcionario();
		empregado.setCodigoFuncionario(rs.getInt(1));
		empregado.setNomeFuncionario(rs.getString(2).toUpperCase());
		empregado.setEmail(rs.getString(3));
		empregado.setCpf(rs.getString(4).toUpperCase());
		empregado.setIdentidade(rs.getString(5).toUpperCase());
		empregado.setSalario(rs.getDouble(6));
		empregado.setComissao(rs.getDouble(7));
		empregado.setReajuste(rs.getDouble(8));
		
		empregado.setEndereco(new Endereco(rs.getInt(9))); 
		
		
		pstmt = conect.prepareStatement("select * from endereco where codigoendereco = ?");   
		pstmt.setInt(1, empregado.getEndereco().getCodigoEndereco());                  
		ResultSet resultado2 = pstmt.executeQuery();             
		
		resultado2.next();                   
		
		Endereco end = new Endereco();         
		end.setCodigoEndereco(resultado2.getInt(1));  
		end.setLogradouro(resultado2.getString(2).trim().toUpperCase());     
		end.setNumero(resultado2.getString(3).trim().toUpperCase());    
		end.setBairro(resultado2.getString(4).trim().toUpperCase()); 
		end.setEstado(resultado2.getString(6).trim().toUpperCase());  
		end.setCidade(resultado2.getString(5).trim().toUpperCase());   
		end.setCep(resultado2.getString(7).trim().toUpperCase());       
		empregado.setEndereco(end); 
		
		return empregado;
		
	}
	public void AlterarFuncionario(Funcionario empregado) throws ExceptionNuloOuVazio, SQLException, ClassNotFoundException{
		Connection conect = ConexaoBD.pegarConexao();
		PreparedStatement pstmt = null;
		
		pstmt = conect.prepareStatement("update funcionario set nomefuncionario = ?, email = ?, cpf = ?, identidade = ?, salario = ?, comissao = ?, reajuste = ? where codigofuncionario = ?  ");
		pstmt.setString(1, empregado.getNomeFuncionario());
		pstmt.setString(2, empregado.getEmail());
		pstmt.setString(3, empregado.getCpf());
		pstmt.setString(4, empregado.getIdentidade());
		pstmt.setDouble(5, empregado.getSalario());
		pstmt.setDouble(6, empregado.getComissao());
		pstmt.setDouble(7, empregado.getReajuste());
		pstmt.setInt(8, empregado.getCodigoFuncionario());
		
		pstmt.executeUpdate();
		
		pstmt = conect.prepareStatement("update endereco set  logradouro = ?, numero = ?, bairro = ?, cidade = ?, estado = ?, cep = ? where codigoendereco = ?");
		pstmt.setString(1, empregado.getEndereco().getLogradouro().trim().toUpperCase());
		pstmt.setString(2, empregado.getEndereco().getNumero().trim().toUpperCase());
		pstmt.setString(3, empregado.getEndereco().getBairro().trim().toUpperCase());
		pstmt.setString(4, empregado.getEndereco().getCidade().trim().toUpperCase());
		pstmt.setString(5, empregado.getEndereco().getEstado().trim().toUpperCase());
		pstmt.setString(6, empregado.getEndereco().getCep().trim().toUpperCase());
		pstmt.setInt(7, empregado.getEndereco().getCodigoEndereco());
		
		pstmt.executeUpdate();		
	}
	
	public String pegarcod() throws ClassNotFoundException, SQLException{
		Connection con = ConexaoBD.pegarConexao();
		Statement stmt = con.createStatement();
		
		ResultSet resultado = stmt.executeQuery("select max(codigofuncionario)+1 from funcionario");
		resultado.next();
		String codfunc = resultado.getString(1);
		
		return codfunc;
	}

	public int pegarendereco(int codfunc) throws ClassNotFoundException, SQLException{
		Connection con = ConexaoBD.pegarConexao();
		PreparedStatement stmt = null;
		
		stmt = con.prepareStatement("select codigoendereco from funcionario where codigofuncionario = ?");
		stmt.setInt(1, codfunc);
		ResultSet rs = stmt.executeQuery();
		rs.next();
		
		return rs.getInt(1);
	}

}
